package dao;

import java.rmi.RemoteException;
import java.util.*;
import org.hibernate.*;
import org.hibernate.classic.Session;
import Entity.*;
import Utils.HibernateUtil;
import Negocio.MesaSimple;
import dto.*;

public class MesaDAO {

	private static MesaDAO intances;
	private static SessionFactory sf;
	
	public static MesaDAO getInstance()
	{
		if (intances == null)
		{
			sf = HibernateUtil.getSessionFactory();
			intances = new MesaDAO();
		}
		return intances;
	}
	
	public MesaDTO ObtenerMesa (int numeroMesa, int suc) 
	{
		MesaDTO mesa = new MesaDTO ();
		MesaSimpleEntity auxs = null;
		MesaCompuestaEntity auxc = null;

		Session session = sf.openSession();
		Query q = session.createQuery("select ms from MesaSimpleEntity ms, SucursalEntity s where ms.numeroMesa = :numeroMesa and s.idSucursal = :suc");
		q.setParameter("numeroMesa",numeroMesa);
		q.setParameter("suc",suc);
		if (q.list().size() != 0)
		{
			auxs = (MesaSimpleEntity) q.list().get(0);//.uniqueResult();
			mesa.setNumeroMesa(auxs.getNumeroMesa());
			mesa.setLugares(auxs.getLugares());
			mesa.setMesaOcupacion(pasarMO(auxs.getMesaOcupacion()));
			mesa.setActivo(auxs.getActivo());
			mesa.setOriginal(auxs.getOriginal());
			mesa.setOcupada(auxs.getOcupada());
		}
		else
		{
			q = session.createQuery("select ms from MesaCompuestaEntity ms, SucursalEntity s where ms.numeroMesa = :numeroMesa and s.idSucursal = :suc");
			q.setParameter("numeroMesa",numeroMesa);
			q.setParameter("suc",suc);
			auxc = (MesaCompuestaEntity) q.list().get(0);//.uniqueResult();
			mesa.setNumeroMesa(auxc.getNumeroMesa());
			mesa.setLugares(auxc.getLugares());
			mesa.setMesaOcupacion(pasarMO(auxc.getMesaOcupacion()));
			mesa.setActivo(auxc.getActivo());
			mesa.setOriginal(auxc.getOriginal());
		}
		session.close();
		return mesa;
	}
	
	private List<MesaOcupacionDTO> pasarMO (List<MesaOcupacionEntity> lista)
	{
		List<MesaOcupacionDTO> lmo = new ArrayList<MesaOcupacionDTO>();
		for (int i=0; i< lista.size();i++)
		{
			MesaOcupacionDTO mo = new MesaOcupacionDTO();
			mo.setCantidadPersonas(lista.get(i).getCantidadPersonas());
			mo.setFechaEgreso(lista.get(i).getFechaEgreso());
			mo.setFechaIngreso(lista.get(i).getFechaIngreso());
			mo.setFechaIngreso(lista.get(i).getFechaIngreso());
			lmo.add(mo);
		}
		return lmo;
	}
	
	public void crearMesaSimple (MesaSimple mesa, SucursalEntity suc)
	{
		MesaSimpleEntity mesaGrabar = new MesaSimpleEntity();
		mesaGrabar.setNumeroMesa(mesa.getNumeroMesa());
		mesaGrabar.setLugares(mesa.getLugares());
		mesaGrabar.setActivo(mesa.isActivo());
		mesaGrabar.setId(maximoId()+1); 
		mesaGrabar.setMesaOcupacion(null);
		mesaGrabar.setOcupada(mesa.isOcupada());
		mesaGrabar.setOriginal(mesa.isOriginal());
		mesaGrabar.setSucursal(suc);
		Session session = sf.openSession();
		session.beginTransaction();
		session.persist(mesaGrabar);
		session.flush();
		session.getTransaction().commit();
		session.close();
	}

	public void unirMesas (List<MesaDTO> mesas, SucursalEntity suc)
	{
		Session session = sf.openSession();
		MesaSimpleEntity auxs = null;
		int max = 0, lugaresT = 0;
		List <MesaSimpleEntity> mesasCargar = new ArrayList<MesaSimpleEntity>();
		for (int i = 0; i<mesas.size(); i++)
		{
			Query q = session.createQuery("from MesaSimpleEntity ms where ms.numeroMesa = ?").setInteger(0, mesas.get(i).getNumeroMesa());
			if (q.list().size() != 0)
			{
				auxs = (MesaSimpleEntity) q.list().get(0);//.uniqueResult();
				lugaresT = lugaresT + auxs.getLugares();
				if (max < auxs.getNumeroMesa())
				{
					max = auxs.getNumeroMesa();
				}
				mesasCargar.add(auxs);
			}
		}
		MesaCompuestaEntity mesaGrabar = new MesaCompuestaEntity();
		mesaGrabar.setNumeroMesa(max);
		mesaGrabar.setLugares(lugaresT);
		mesaGrabar.setActivo(true);
		mesaGrabar.setId(maximoId()+1); 
		mesaGrabar.setMesaOcupacion(null);
		mesaGrabar.setOcupada(true);
		mesaGrabar.setOriginal(false);
		mesaGrabar.setSucursal(suc);
		mesaGrabar.setMesaCompone(mesasCargar);
		session.beginTransaction();
		session.persist(mesaGrabar);
		session.flush();
		session.getTransaction().commit();
		for (int i = 0; i<mesas.size(); i++)
		{
			Query q = session.createQuery("update MesaSimpleEntity ms set activo= false where ms.numeroMesa = ?").setInteger(0, mesas.get(i).getNumeroMesa());
			q.executeUpdate();
		}	
		
		session.close();
	}
	
	private int maximoId ()
	{
		int i;
		try {
		Session session = sf.openSession();
		Query q = session.createQuery("select max(id) from MesaEntity");
		i = (Integer) q.uniqueResult();
		session.close();
		} catch (Exception e)
		{	i= 0;
		
		}
		return i;
	}
}
